package com.le.tester.book.effectivejava3rdchinese.articlethirtytwo;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;

import static org.apache.commons.lang3.ArrayUtils.toArray;

/**
 * createTime：2022/8/18 13:40
 * description：
 */
public class Demo {
    //@SafeVarargs
    //@SafeVarargs,如果不会发生类型安全转换异常的话，可以使用该注解
    public static void dangerous(List<String>... stringList) {

        List<Integer> intList = new ArrayList<>();
        intList.add(42);
        Object[] objects = stringList;
        objects[0] = intList;
        String s = stringList[0].get(0);
    }

    //三个或者三个以上的话，声明方式应该有正确的修改方式
    //还是的转变泛型的使用，只是为了可变参数的最大化List<? extend T>
    @SafeVarargs//已知不会发生类型转换异常
    static <T> List<T> pickTwo(List<? extends T>... lists) {

//        switch (ThreadLocalRandom.current().nextInt(3)) {
//            case 0:
//                return toArray(a, b);
//            case 1:
//                return toArray(a, c);
//            case 2:
//                return toArray(b, c);
//        }
//        throw new AssertionError();
        List<T> result = new ArrayList<>();
        for (List<? extends T> list : lists) {
            result.addAll(list);
        }
        return result;
    }

    static <T> List<T> flatten(List<List<? extends T>> lists) {
        List<T> result = new ArrayList<>();
        for (List<? extends T> listItem : lists) {
            result.addAll(listItem);
        }
        return result;

    }

    public static void main(String[] args) {
        //对于数组而言，string[]属于sting[],而Object[]属于Object[]
        //对于pickTwo的强制隐形转换，这个是非法的，会报classCastE
        //String[] strings = pickTwo("Good", "Fast", "Cheap");
        //System.out.println(Arrays.toString(strings));
    }
}
